#include "../../mqserver/mq_consumer.hpp"
#include <gtest/gtest.h>

bitmq::ConsumerManager::ptr cmp;

class ConsumerTest : public testing::Environment
{
public:
    virtual void SetUp() override
    { 
        cmp = std::make_shared<bitmq::ConsumerManager>();
        cmp->initQueueConsumer("queue1");
    }

    virtual void TearDown() override 
    { }
};

void cb(const std::string &ctag, const bitmq::BasicProperties* bp, const std::string& queue_name)
{

}

TEST(consumer_test, insert_test)
{
    cmp->create("consumer1", "queue1", true, cb);
    cmp->create("consumer2", "queue1", true, cb);
    cmp->create("consumer3", "queue1", true, cb);
    ASSERT_EQ(cmp->exists("consumer1", "queue1"), true);
    ASSERT_EQ(cmp->exists("consumer2", "queue1"), true);
    ASSERT_EQ(cmp->exists("consumer3", "queue1"), true);
    ASSERT_EQ(cmp->exists("consumer1", "queue2"), false);
}

TEST(consumer_test, remove_test)
{
    cmp->remove("consumer1", "queue1");

    ASSERT_EQ(cmp->exists("consumer1", "queue1"), false);
    ASSERT_EQ(cmp->exists("consumer2", "queue1"), true);
    ASSERT_EQ(cmp->exists("consumer3", "queue1"), true);
}

TEST(consumer_test, choose_test)
{
    bitmq::Consumer::ptr cp1 = cmp->choose("queue1");
    ASSERT_NE(cp1.get(), nullptr);
    ASSERT_EQ(cp1->tag, "consumer2");
    
    bitmq::Consumer::ptr cp2 = cmp->choose("queue1");
    ASSERT_NE(cp2.get(), nullptr);
    ASSERT_EQ(cp2->tag, "consumer3");

    bitmq::Consumer::ptr cp3 = cmp->choose("queue1");
    ASSERT_NE(cp3.get(), nullptr);
    ASSERT_EQ(cp3->tag, "consumer2");
}

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    testing::AddGlobalTestEnvironment(new ConsumerTest);
    RUN_ALL_TESTS();
    return 0;
}